package com.dabai.qrtools.utils;

import android.annotation.SuppressLint;

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;


/**
 * 日期时间工具类
 *
 * @author BAI
 */
public class DateUtils {

    /**
     * yyyy-MM-dd HH:mm:ss
     * 时间格式化字符串  用哪拿哪 比如想格式化年份 : 今年是yyyy年
     */


    /**
     * 将时间间隔转换为可读信息
     *
     * @param date
     * @param nowTime
     * @return
     */
    public static String humanInterval(Date date, Date nowTime) {
        if (date == null) return "";
        // long diff = nowTime - date.getTime();
        long diff = nowTime.getTime() - date.getTime();

        diff /= 1000;
        if (diff < 60) return "刚刚";
        if (diff < 3600) return diff / 60 + "分钟前";
        if (diff > 3600 && diff < 3600 * 24) return diff / 3600 + "小时前";
        if (diff < 3600 * 24 * 7 && diff > 3600 * 24) return diff / (3600 * 24) + "天前";
        return dateToString(date, "yyyy-MM-dd");
    }

    /**
     * 计算可读的时间间隔
     *
     * @param date 日期
     * @return {@link String}
     */
    public static String humanInterval(Date date) {
        return humanInterval(date, new Date());
    }

    /**
     * 判断是否在同一分钟内
     *
     * @param one 一个
     * @param tow 拖
     * @return boolean
     */
    public static boolean inSameMinute(Date one, Date tow) {
        if ((one == null) || (tow == null)) return false;
        return one.getTime() / 60000 == tow.getTime() / 60000;
    }

    /**
     * 判断是否在同一分钟内
     *
     * @param one 一个
     * @param tow 拖
     * @return boolean
     */
    public static boolean inSameMinuteByLong(long one, long tow) {
        return one / 60000 == tow / 60000;
    }


    /**
     * 判断当前年是否闰年
     *
     * @return 返回当前闰年
     */
    public static boolean isLeapYear() {
        /**
         * 详细设计： 1.被400整除是闰年，否则： 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年
         * 3.能被4整除同时能被100整除则不是闰年
         */
        Date d = new Date();
        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
        gc.setTime(d);
        int year = gc.get(Calendar.YEAR);
        if ((year % 400) == 0) {
            return true;
        } else if ((year % 4) == 0) {
            if ((year % 100) == 0) {
                return false;
            } else {
                return true;
            }
        } else {
            return false;
        }
    }


    /**
     * 将时间格式字符串转换为时间
     *
     * @param strDate 时间字符串
     * @param pattern 格式 yyyy-MM-dd HH:mm:ss
     * @return 返回date对象
     */
    @SuppressLint("SimpleDateFormat")
    public static Date stringToDate(String strDate, String pattern) {
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);
        ParsePosition pos = new ParsePosition(0);
        return formatter.parse(strDate, pos);
    }

    /**
     * 返回短时间字符串格式yyyy-MM-dd
     *
     * @param date 日期
     * @return {@link String}
     */
    public static String dateToString(Date date, String pattern) {
        @SuppressLint("SimpleDateFormat")
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);
        return formatter.format(date);
    }


    /**
     * 获取指定类型的当前时间
     *
     * @param i 类型
     * @return 指定类型的日期
     * <p>
     * 1 : 2021-05-28 08:20
     * 2 : 2021年05月28日 08:20
     * 3 : 20210528_202042
     * 4 : 20210528082042
     * 5 : 08:20
     * 6 : 下午08:20
     * 7 : 20:20
     * 8 : Fri May 28 20:20:42 GMT+08:00 2021
     */
    @SuppressLint("SimpleDateFormat")
    public static String getNowTime(int i) {
        String time = null;
        SimpleDateFormat sdf;
        switch (i) {
            case 1:
                sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");
                time = sdf.format(new Date());
                break;
            case 2:
                sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
                time = sdf.format(new Date());
                break;
            case 3:
                sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
                time = sdf.format(new Date());
                break;
            case 4:
                sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                time = sdf.format(new Date());
                break;
            case 5:
                sdf = new SimpleDateFormat("hh:mm");
                time = sdf.format(new Date());
                break;
            case 6:
                sdf = new SimpleDateFormat((Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 12 ? "下午" : "上午") + "hh:mm");
                time = sdf.format(new Date());
                break;
            case 7:
                sdf = new SimpleDateFormat("HH:mm");
                time = sdf.format(new Date());
                break;
            default:
                time = new Date().toString();
                break;
        }
        return time;
    }


    /**
     * 得到现在的时间
     * 获取指定格式的当前时间
     * <p>
     * yyyy-MM-dd HH:mm:ss
     * 时间格式化字符串  用哪拿哪 比如想格式化年份 : 当前时间 yyyy-MM-dd HH:mm:ss
     *
     * @param pattern 模式
     * @return {@link String}
     */
    @SuppressLint("SimpleDateFormat")
    public static String getNowTime(String pattern) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            return sdf.format(new Date());
        } catch (Exception e) {
            return pattern;
        }
    }


    /**
     * 有时间
     * 获取 指定格式化的指定时间
     *
     * @param pattern 模式
     * @param time    时间
     * @return {@link String}
     */
    @SuppressLint("SimpleDateFormat")
    public static String getTime(String pattern, long time) {

        try {
            return new SimpleDateFormat(pattern).format(time);
        } catch (Exception e) {
            return time + "";
        }

    }

    /**
     * 规则是否合法
     *
     * @param pattern 模式
     * @return boolean
     */
    @SuppressLint("SimpleDateFormat")
    public static boolean legalRules(String pattern) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            sdf.format(new Date());
            return true;
        } catch (Exception e) {
            return false;
        }
    }


}
